package com.silence.springboot.service.impl;


import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.silence.springboot.convert.RoleConvert;
import com.silence.springboot.dao.RoleDao;
import com.silence.springboot.entity.RoleEntity;
import com.silence.springboot.enums.ResultCode;
import com.silence.springboot.exception.ApiException;
import com.silence.springboot.mapper.RoleMapper;
import com.silence.springboot.service.RoleService;
import com.silence.springboot.vo.input.AddRoleInput;
import com.silence.springboot.vo.input.PageRolesInput;
import com.silence.springboot.vo.input.UpdateRoleInput;
import com.silence.springboot.vo.output.PageRolesOutput;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 权限表 服务层实现。
 *
 * @author mybatis-flex-helper automatic generation
 * @since 1.0
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class RoleServiceImpl extends ServiceImpl<RoleMapper, RoleEntity> implements RoleService {

    /**
     * 权限表 数据访问对象
     */
    private final RoleDao roleDao;

    /**
     * 权限表 转换器
     */
    private final RoleConvert roleConvert;


    /**
     * 分页查询权限表
     *
     * @param input 分页查询权限表入参
     * @return 分页查询权限表出参
     */
    @Override
    public Page<PageRolesOutput> pageRoles(PageRolesInput input) {
        // 入参转换
        RoleEntity roleEntity = roleConvert.pageRolesInputToRoleEntity(input);
        // 分页查询
        Page<RoleEntity> page = roleDao.pageRoles(input.getPageNum(), input.getPageSize(), roleEntity);
        // 出参转换
        return page.map(roleConvert::roleEntityToPageRolesOutput);
    }

    /**
     * 新增权限表
     *
     * @param input 新增权限表入参
     */
    @Override
    public void addRole(AddRoleInput input) {
        // 入参转换
        RoleEntity roleEntity = roleConvert.addRoleInputToRoleEntity(input);
        // 校验角色编码是否存在
        String roleCode = roleEntity.getRoleCode();
        if (roleDao.existRoleCode(roleCode)) {
            throw new ApiException(ResultCode.ROLE_CODE_EXIST);
        }
        // 新增权限表
        roleDao.addRole(roleEntity);
    }

    /**
     * 更新权限表
     *
     * @param input 更新权限表入参
     */
    @Override
    public void updateRole(UpdateRoleInput input) {
        // 入参转换
        RoleEntity roleEntity = roleConvert.updateRoleInputToRoleEntity(input);
        // 校验角色编码是否存在
        String roleCode = roleEntity.getRoleCode();
        if (roleDao.existRoleCode(roleCode)) {
            throw new ApiException(ResultCode.ROLE_CODE_EXIST);
        }
        // 更新权限表
        roleDao.updateRole(roleEntity);
    }

    /**
     * 根据id删除权限表
     *
     * @param id 权限表主键
     */
    @Override
    public void deleteRoleById(String id) {
        roleDao.deleteById(id);
    }

    /**
     * 根据ids批量删除权限表
     *
     * @param ids 权限表主键列表
     */
    @Override
    public void deleteRoleByIds(List<String> ids) {
       roleDao.deleteBatchByIds(ids);
    }
}